package cn.liu._05_topic;

import cn.liu.ConnectionUtil;
import com.rabbitmq.client.*;

import java.io.IOException;

//消息接收方（消费者）
public class Rev2 {
    //声明该消费者自己的队列
    private final static String QUEUE_NAME_TOPIC_1010_2 = "queue_name_topic_1010_2";

    public static void main(String[] args) throws Exception {

        //1.创建连接
        Connection connection = ConnectionUtil.getConnection();

        //2.创建通道
        Channel channel = connection.createChannel();

        //3.声明队列
        channel.queueDeclare(QUEUE_NAME_TOPIC_1010_2,true,false,false,null);

        //4.把队列绑定到交换机
        channel.queueBind(
                QUEUE_NAME_TOPIC_1010_2, //消费者的队列
                Send.NAME_EXCHANGE_TOPIC_1010, //绑定到哪个交换机
                "item.insert" //这个队列以什么名字绑定到交换机
        );
        channel.queueBind(
                QUEUE_NAME_TOPIC_1010_2, //消费者的队列
                Send.NAME_EXCHANGE_TOPIC_1010, //绑定到哪个交换机
                "item.delete" //这个队列以什么名字绑定到交换机
        );

        //同一时间只能处理一个消息
        channel.basicQos(1);

        //4.消费消息
        //消费方法
        DefaultConsumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消费者的标签 ："+consumerTag);
                //System.out.println("对象 ："+envelope);
                System.out.println("交换机 ："+envelope.getExchange());
                System.out.println("消息的ID ："+envelope.getDeliveryTag());
                System.out.println("队列 ："+envelope.getRoutingKey());
                System.out.println("消息的内容 ："+new String(body));
            }
        };
        /**
         * 监听队列String queue, boolean autoAck,Consumer callback
         * 参数明细
         * 1、队列名称
         * 2、是否自动回复，设置为true为表示消息接收到自动向mq回复接收到了，mq接收到回复会删除消息，设置为false则需要手动回复
         * 3、消费消息的方法，消费者接收到消息后调用此方法
         */
        channel.basicConsume(QUEUE_NAME_TOPIC_1010_2 , true,consumer);
    }
}
